package br.com.appestoque;

import java.security.InvalidKeyException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;

import org.json.JSONArray;
import org.json.JSONObject;

import br.com.appestoque.protocolo.Http;
import br.com.appestoque.seguranca.Criptografia;
import br.com.appestoque.seguranca.HashCode;
import br.com.appestoque.util.Constantes;
import br.com.appestoque.util.Conversor;
import br.com.appestoque.util.Propriedade;

public class Console {
	
	final static int REGISTROS_POR_REQUISICAO = 100;
	
	public static void main(String[] args) {
		int i = 0;
		Criptografia criptografia = new Criptografia();
		HashCode hashCode = new HashCode();
		String uuid = null, cnpj = null;
		try {
			uuid = Conversor.byteToString(criptografia.cifrar(Propriedade.properties.getProperty("uuid")),br.com.appestoque.util.Constantes.DELIMITADOR);
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		cnpj = hashCode.processar(Propriedade.properties.getProperty("cnpj"));
		
		Connection conn = null, conn1 = null;  
		
		try {
			String url = null;
			System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Analisando conexão...");
			switch (Integer.parseInt(args[0])) {
				case 0:	url = CarregaProperties.properties.getProperty("servidor")+Constantes.URL_ENVIAR_CIDADE; 
						break;
				case 1: url = CarregaProperties.properties.getProperty("servidor")+Constantes.URL_ENVIAR_BAIRRO; 
						break;	
				case 2: url = CarregaProperties.properties.getProperty("servidor")+Constantes.URL_ENVIAR_PRODUTO; 
						break;
				case 3: url = CarregaProperties.properties.getProperty("servidor")+Constantes.URL_ENVIAR_CLIENTE; 
						break;	
			}	
			System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Conectando ao banco de dados...");

			conn = CarregaConection.getInstance();
			conn1 = CarregaConection.getInstance();
			
			PreparedStatement preparedStatement = null;
			ResultSet resultSet = null;
			JSONArray objetos = null;
			JSONObject objeto = null;
			boolean enviar = false;
			switch (Integer.parseInt(args[0])) {
				case 0://CIDADE
					System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Carregando cidades...");
					preparedStatement = conn.prepareStatement(CarregaProperties.properties.getProperty("sql.cidades"));
					conn1.setAutoCommit(false);
					resultSet = preparedStatement.executeQuery();
					objetos = new JSONArray();
					i = 0;
					while (resultSet.next()) {
						if(objetos==null){
							objetos = new JSONArray();
						}
						
						enviar = false;
						
						PreparedStatement preparedStatementCidade = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.cidades.buscar"));
						preparedStatementCidade.setString(1,resultSet.getString("NOME").trim());
						ResultSet resultSetCidade = preparedStatementCidade.executeQuery();
						
						boolean localizado = false;							
						localizado = resultSetCidade.next();
						
						if(!localizado){
							preparedStatementCidade = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.cidades.adicionar"));
							preparedStatementCidade.setString(1,resultSet.getString("NOME").trim());
							preparedStatementCidade.executeUpdate();
							enviar = !enviar;
						}
						
						if(enviar){
							++i;
							objeto = new JSONObject();
							objeto.put("nome", resultSet.getString("NOME").trim());
							objetos.put(objeto);
						}
						
						if (i%REGISTROS_POR_REQUISICAO==0&&objetos.length()>0) {
							objeto = new JSONObject();
							objeto.put("cnpj",cnpj);
							objeto.put("uuid",uuid);
							objeto.put("objetos", objetos.toString());
							Http.enviar(url, objeto);
							conn1.commit();
							objetos = null;
						}
					}
					
					if(objetos!=null&&objetos.length()>0){
						objeto = new JSONObject();
						objeto.put("cnpj",cnpj);
						objeto.put("uuid",uuid);
						objeto.put("objetos",objetos.toString());
						Http.enviar(url,objeto);
						conn1.commit();
						objetos = null;
					}
					
					break;
				case 1://BAIRRO
					System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Carregando bairros...");
					preparedStatement = conn.prepareStatement(CarregaProperties.properties.getProperty("sql.bairros"));
					conn1.setAutoCommit(false);
					resultSet = preparedStatement.executeQuery();
					objetos = new JSONArray();
					i = 0;
					while (resultSet.next()) {
						if(objetos==null){
							objetos = new JSONArray();
						}
						
						enviar = false;
						
						PreparedStatement preparedStatementBairro = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.bairros.buscar"));
						preparedStatementBairro.setString(1,resultSet.getString("NOME"));
						preparedStatementBairro.setString(2,resultSet.getString("CIDADE"));
						ResultSet resultSetBairro = preparedStatementBairro.executeQuery();
						
						boolean localizado = false;							
						localizado = resultSetBairro.next();
						
						if(!localizado){
							preparedStatementBairro = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.bairros.adicionar"));
							preparedStatementBairro.setString(1,resultSet.getString("NOME").trim());
							preparedStatementBairro.setString(2,resultSet.getString("CIDADE").trim());
							preparedStatementBairro.executeUpdate();
							enviar = !enviar;
						}
						
						if(enviar){
							++i;
							objeto = new JSONObject();
							objeto.put("nome", resultSet.getString("NOME").trim());
							objeto.put("cidade", resultSet.getString("CIDADE").trim());
							objetos.put(objeto);
						}
						
						if (i%REGISTROS_POR_REQUISICAO==0&&objetos.length()>0) {
							objeto = new JSONObject();
							objeto.put("cnpj",cnpj);
							objeto.put("uuid",uuid);
							objeto.put("objetos", objetos.toString());
							Http.enviar(url, objeto);
							conn1.commit();
							objetos = null;
						}
						
					}
					
					if(objetos!=null&&objetos.length()>0){
						objeto = new JSONObject();
						objeto.put("cnpj",cnpj);
						objeto.put("uuid",uuid);
						objeto.put("objetos",objetos.toString());
						Http.enviar(url,objeto);
						conn1.commit();
						objetos = null;
					}
					
					break;
				case 2://PRODUTO
					System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Carregando produtos...");
					preparedStatement = conn.prepareStatement(CarregaProperties.properties.getProperty("sql.produtos"));
					conn1.setAutoCommit(false);
					resultSet = preparedStatement.executeQuery();
					objetos = new JSONArray();
					i = 0;					
					while (resultSet.next()) {
						if(objetos==null){
							objetos = new JSONArray();
						}
						
						enviar = false;
						
						PreparedStatement preparedStatementProduto = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.produtos.buscar"));
						preparedStatementProduto.setLong(1,resultSet.getLong("CODIGO"));
						ResultSet resultSetProduto = preparedStatementProduto.executeQuery();
						
						boolean localizado = false;							
						localizado = resultSetProduto.next();
						
						if(localizado&&
								((!resultSet.getString("NOME").trim().equals(resultSetProduto.getString("NOME").trim()))||
								 (!resultSet.getString("NUMERO").trim().equals(resultSetProduto.getString("NUMERO").trim()))||
								 (resultSet.getDouble("PRECO")!=resultSetProduto.getDouble("VALOR"))||
								 (resultSet.getDouble("MINIMO")!=resultSetProduto.getDouble("MINIMO"))||
								 (resultSet.getDouble("QUANTIDADE")!=resultSetProduto.getDouble("QUANTIDADE"))
								 )){
							preparedStatementProduto = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.produtos.atualizar"));
							preparedStatementProduto.setString(1,resultSet.getString("NOME").trim());
							preparedStatementProduto.setString(2,resultSet.getString("NUMERO").trim());
							preparedStatementProduto.setDouble(3,resultSet.getDouble("PRECO"));
							preparedStatementProduto.setDouble(4,resultSet.getDouble("MINIMO"));
							preparedStatementProduto.setDouble(5,resultSet.getDouble("QUANTIDADE"));
							preparedStatementProduto.setLong(6,resultSet.getLong("CODIGO"));
							preparedStatementProduto.executeUpdate();
							enviar = !enviar;
						}else if(!localizado){
							preparedStatementProduto = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.produtos.adicionar"));
							preparedStatementProduto.setLong(1,resultSet.getLong("CODIGO"));
							preparedStatementProduto.setString(2,resultSet.getString("NOME").trim());
							preparedStatementProduto.setString(3,resultSet.getString("NUMERO").trim());
							preparedStatementProduto.setDouble(4,resultSet.getDouble("PRECO"));
							preparedStatementProduto.setDouble(5,resultSet.getDouble("MINIMO"));
							preparedStatementProduto.setDouble(6,resultSet.getDouble("QUANTIDADE"));
							preparedStatementProduto.executeUpdate();
							enviar = !enviar;
						}
						
						if(enviar){
							++i;
							objeto = new JSONObject();
							objeto.put("id", resultSet.getLong("CODIGO"));
							objeto.put("nome", resultSet.getString("NOME").trim());
							objeto.put("numero", resultSet.getString("NUMERO").trim());
							objeto.put("preco", resultSet.getDouble("PRECO"));
							objeto.put("minimo", resultSet.getDouble("MINIMO"));
							objeto.put("quantidade", resultSet.getDouble("QUANTIDADE"));
							objetos.put(objeto);
						}
						
						if (i%REGISTROS_POR_REQUISICAO==0&&objetos.length()>0) {
							objeto = new JSONObject();
							objeto.put("cnpj",cnpj);
							objeto.put("uuid",uuid);
							objeto.put("objetos", objetos.toString());
							Http.enviar(url, objeto);
							conn1.commit();
							objetos = null;
						}
					}
					
					if(objetos!=null&&objetos.length()>0){
						objeto = new JSONObject();
						objeto.put("cnpj",cnpj);
						objeto.put("uuid",uuid);
						objeto.put("objetos", objetos.toString());
						Http.enviar(url,objeto);
						conn1.commit();
						objetos = null;
					}
					
					break;
				case 3://CLIENTE
					System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Carregando clientes...");
					preparedStatement = conn.prepareStatement(CarregaProperties.properties.getProperty("sql.clientes"));
					conn1.setAutoCommit(false);
					resultSet = preparedStatement.executeQuery();
					objetos = new JSONArray();
					i = 0;
					
					while (resultSet.next()) {
						
						if(objetos==null){
							objetos = new JSONArray();
						}
						if(resultSet.getString("NOME")!=null){
							
							enviar = false;
							
							PreparedStatement preparedStatementCliente =  conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.clientes.buscar"));
							preparedStatementCliente.setLong(1,resultSet.getLong("CODIGO"));
							ResultSet resultSetCliente = preparedStatementCliente.executeQuery();
							
							boolean localizado = false;							
							localizado = resultSetCliente.next();
							
							if(localizado&&((!resultSet.getString("NOME").trim().equals(resultSetCliente.getString("NOME").trim()))||
									 (!resultSet.getString("RAZAO").trim().equals(resultSetCliente.getString("RAZAO").trim()))||
									 (!resultSet.getString("CNPJ").trim().equals(resultSetCliente.getString("CNPJ").trim()))||
									 (!resultSet.getString("ENDERECO").trim().equals(resultSetCliente.getString("ENDERECO").trim()))||
									 (resultSet.getLong("NUMERO")!=resultSetCliente.getLong("NUMERO"))||
									 (resultSet.getString("CEP")!=null&&!resultSet.getString("CEP").trim().equals(resultSetCliente.getString("CEP").trim()))||
									 (!resultSet.getString("COMPLEMENTO").trim().equals(resultSetCliente.getString("COMPLEMENTO").trim()))||
									 (!resultSet.getString("BAIRRO").trim().equals(resultSetCliente.getString("BAIRRO").trim()))||
									 (!resultSet.getString("CIDADE").trim().equals(resultSetCliente.getString("CIDADE").trim()))
									 )){
								preparedStatementCliente = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.clientes.atualizar"));
								preparedStatementCliente.setString(1,resultSet.getString("NOME"));
								preparedStatementCliente.setString(2,resultSet.getString("RAZAO").trim());
								preparedStatementCliente.setString(3,resultSet.getString("CNPJ")!=null?resultSet.getString("CNPJ").trim():"");
								preparedStatementCliente.setString(4,resultSet.getString("ENDERECO")!=null?resultSet.getString("ENDERECO").trim():"");
								preparedStatementCliente.setString(5,resultSet.getString("COMPLEMENTO")!=null?resultSet.getString("COMPLEMENTO").trim():"");
								preparedStatementCliente.setLong(6,resultSet.getLong("NUMERO"));
								preparedStatementCliente.setString(7,resultSet.getString("CEP")!=null?resultSet.getString("CEP").trim():"");
								preparedStatementCliente.setString(8,resultSet.getString("BAIRRO").trim());
								preparedStatementCliente.setString(9,resultSet.getString("CIDADE").trim());
								preparedStatementCliente.setLong(10,resultSet.getLong("CODIGO"));
								preparedStatementCliente.executeUpdate();
								enviar = !enviar;
							}else if(!localizado){
								preparedStatementCliente = conn1.prepareStatement(CarregaProperties.properties.getProperty("sql.clientes.adicionar"));
								preparedStatementCliente.setLong(1,resultSet.getLong("CODIGO"));
								preparedStatementCliente.setString(2,resultSet.getString("NOME").trim());
								preparedStatementCliente.setString(3,resultSet.getString("RAZAO").trim());
								preparedStatementCliente.setString(4,resultSet.getString("CNPJ")!=null?resultSet.getString("CNPJ").trim():"");
								preparedStatementCliente.setString(5,resultSet.getString("ENDERECO")!=null?resultSet.getString("ENDERECO").trim():"");
								preparedStatementCliente.setString(6,resultSet.getString("COMPLEMENTO")!=null?resultSet.getString("COMPLEMENTO").trim():"");
								preparedStatementCliente.setLong(7,resultSet.getLong("NUMERO"));
								preparedStatementCliente.setString(8,resultSet.getString("CEP")!=null?resultSet.getString("CEP").trim():"");
								preparedStatementCliente.setString(9,resultSet.getString("BAIRRO").trim());
								preparedStatementCliente.setString(10,resultSet.getString("CIDADE").trim());
								preparedStatementCliente.executeUpdate();
								enviar = !enviar;
							}
							
							if(enviar){
								++i;						
								objeto = new JSONObject();
								objeto.put("id", resultSet.getLong("CODIGO"));
								objeto.put("nome", resultSet.getString("NOME").trim());
								objeto.put("razao", resultSet.getString("RAZAO").trim());
								objeto.put("cnpj", resultSet.getString("CNPJ")!=null?resultSet.getString("CNPJ").trim():"");
								objeto.put("endereco",resultSet.getString("ENDERECO")!=null?resultSet.getString("ENDERECO").trim():"");
								objeto.put("numero", resultSet.getLong("NUMERO"));
								objeto.put("cep",resultSet.getString("CEP")!=null?resultSet.getString("CEP").trim():"");
								objeto.put("complemento", resultSet.getString("COMPLEMENTO")!=null?resultSet.getString("COMPLEMENTO").trim():"");
								objeto.put("bairro", resultSet.getString("BAIRRO").trim());
								objeto.put("cidade", resultSet.getString("CIDADE").trim());
								objetos.put(objeto);
							}
							
							if (i%REGISTROS_POR_REQUISICAO==0&&objetos.length()>0){
								objeto = new JSONObject();
								objeto.put("cnpj",cnpj);
								objeto.put("uuid",uuid);
								objeto.put("objetos",objetos.toString());
								Http.enviar(url, objeto);		
								conn1.commit();
								objetos = null;
							}
							
						}
					}
					
					if(objetos!=null&&objetos.length()>0){
						objeto = new JSONObject();
						objeto.put("cnpj",cnpj);
						objeto.put("uuid",uuid);
						objeto.put("objetos",objetos.toString());
						Http.enviar(url,objeto);
						conn1.commit();
						objetos = null;
					}
					
					break;
				default:
					System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Desculpe, mas nenhum par�metro foi passado.");
					break;
			}
			
			System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Desconectando do banco de dados...");
			conn.close();
			conn1.close();
			System.out.println(new SimpleDateFormat(Constantes.FORMATO_DATA_HORA_PADRAO).format(new Date()) + " - Processo concluído...");

		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}